package de.hdu.mfz.dao;


import java.util.List;

import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;


import de.hdu.mfz.model.Route;
import de.hdu.mfz.model.User;

/**
 * Die Zugriffsklasse auf die Daten des Users. Alle Interaktionen mit der Datenbank
 * bez�glich der Beanklasse User sollte in dieser Klasse passieren
 * @author Katharina, Steffi
 */
public class UserDAO extends HibernateDaoSupport {

	/** Defaultkonstruktor */
	public UserDAO(){}
	
	/**
	 * Erstellen eines neuen {@link User} und speichern in der DB.
	 * @param user	
	 */
	public void insert( User user) {
		HibernateTemplate template = getHibernateTemplate();
		template.saveOrUpdate(user);		
	}
	
	/**
	 * L�schen des angegebenen {@link User} aus der DB.
	 * @param user der {@link User} der gel�scht wird.
	 */
	public void delete(  User user) {
		HibernateTemplate template = getHibernateTemplate();
		template.delete(user);
	}
	
	/**
	 * Liefert einen User anhand der �bergebenen UserId
	 * @param UserId  der Prim�rschl�ssel von {@link User}
	 * @return gefundende User 
	 */
	public User findById( int userId) {
		HibernateTemplate template = getHibernateTemplate();
		return (User) template.get(User.class, userId);
	}
	
	/**
	 * Liefert eine Liste mit {@link User} Objekten welche zum �bergegebenen username passen
	 * Die Methode arbeitet wie folgt: 
	 * <ul>
	 * <li>Eine HQL Anfrage ist wird spezifiziert und in einer String variable gespeichert</li>
	 * <li>Empfangen aller{@link User} Objekte von der DB</li>
	 * <li>Pr�fung ob User gefungen wurde</li>
	 * </ul>
	 * @return Liste mit Usern
	 */
	@SuppressWarnings("unchecked")
	public User findByUsername (String username) {
		HibernateTemplate template = getHibernateTemplate();
		List<User> user = (List<User>)template.find("from User as u where u.username = ?", username);
								
		if (user.size()==0 )
			return null;
		else
			return (User)user.get(0);
	}
		
	/**
	 * Liefert alle User von der DB. 
	 * @return Liste mit User
	 * @see User
	 */

	public List<User> findAll() {
		HibernateTemplate template = getHibernateTemplate();
		return template.loadAll(User.class);
	}

	/**
	 * Liefert das User Objekt einer bestimmten Route zur�ck
	 * @param route Route Objekt zu der ein Fahrer ermittelt werden soll
	 * @return User zu der �bergebenen Route
	 */
	public User findByRoute(Route route) {
		HibernateTemplate template = getHibernateTemplate();
		return (User) template.get(User.class, route.getFahrer().getUserId());
	}


}
